manfandomcom_ru-20200213-history
MyStatHost
=Задача= Необходимо контролировать работу каналов связи на удаленных точках (филиалах) и вести централизованную статистику по следующим параметрам: * Время отклика и потери до произвольных хостов (например до шлюзов провайдеров) * Объемы прокачанного трафика и нагрузки на каналы =Метод сбора и агрегирования статистики= Статистику будем получать, подключаясь к удаленным хостам на базе OS Linux Ubuntu через SSH протокол. Затем на удаленном хосте запускаем пинг-флуд на несколько десятков пакетов, а затем парсим результат (среднее значение отклика и процент потерь пакетов). Кроме этого снимаем значения счетчиков принятого и переданного трафика на контролируемых интерфейсах. Всю собранную информацию сохраняем в базе mysql на сервере статистики. Таким образом на стороне клиента достаточно иметь установленный SSH сервер. =Получение данных= Установка компонентов Установим компоненты apt-get install mysql-server mysql-client sshpass Создадим каталог и подготовим базу данных mkdir /etc/mystathost nano /etc/mystathost/createdb.sql Напишем запрос на создание базы USE mystathost; CREATE TABLE pinggw ( datetime DATETIME, hostip VARCHAR(20), hosteth VARCHAR(10), hostgwip VARCHAR(20), pinglost TINYINT, pingavg FLOAT(3), trafrx BIGINT, traftx BIGINT); # Тут назначим права и разрешим удаленное подключение к базе # Пользователь mystathost # Пароль mYs1Pa_swD grant usage on *.* to mystathost@localhost identified by 'mYs1Pa_swD'; grant all privileges on mystathost.* to mystathost@localhost; exit Создадим новую базу mystathost mysqladmin create mystathost -p Выполним запрос на создание структуры и прав. mysql -p < /etc/mystathost/createdb.sql Структура базы готова. Заполнение базы Создадим список доступа к удаленным серверам и контролируемых на них каналов. Каждый канал записывается одной строкой с разделением значений знаком ; (точка с запятой) в следующей последовательности * Адрес сервера для подключения по SSH;пользователь SSH;пароль SSH;Имя контролируемого интерфейса;Адрес, который будем пинговать nano /etc/mystathost/ping-hosts 100.100.100.100;root;123456;eth1;100.100.100.1 100.100.100.100;root;123456;eth0;192.168.0.100 Для каждого канала отдельная строка, даже если сервер один и тот-же. Например можно проверять как внешние так и внутренние каналы филиала. nano /etc/mystathost/pinggw #!/bin/bash ########### Параметры ############# dbuser=mystathost dbpass=mYs1Pa_swD dbname=mystathost dbtable=pinggw pwdhosts=/etc/mystathost/ping-hosts ################################### exec 10<$pwdhosts while read line <&10 ; do IFS=";" set -- $line hostip=$1 hostus=$2 hostpw=$3 hosteth=$4 hostgwip=$5 if [ "${line}" != "" ] then pingrez=`sshpass -p $hostpw ssh -o StrictHostKeyChecking=no $hostus@$hostip \ ping -I $hosteth -f $hostgwip -c 100 -s 32|grep -o -P "\d+(?=% packet loss)|\d+\.\d+(?=/\d+.\d+/\d+.\d+ ms,)"|tr "\n" "|"` pinglost=`echo $pingrez|awk -F "|" '{print $1}'` pingavg=`echo $pingrez|awk -F "|" '{print $2}'` trafif=`sshpass -p $hostpw ssh -o StrictHostKeyChecking=no $hostus@$hostip cat /sys/class/net/$hosteth/statistics/rx_bytes /sys/class/net/$hosteth/statistics/tx_bytes|tr "\n" "|"` trafrx=`echo $trafif|awk -F "|" '{print $1}'` traftx=`echo $trafif|awk -F "|" '{print $2}'` datetime=`date +"%Y/%m/%d %T"` mysql -u$dbuser -p$dbpass -D $dbname -e "INSERT INTO $dbtable (datetime,hostip,hosteth,hostgwip,pinglost,pingavg,trafrx,traftx) \ values ('$datetime','$hostip','$hosteth','$hostgwip','$pinglost','$pingavg','$trafrx','$traftx');" fi done Делаем скрипт исполняемым chmod +x /etc/mystathost/pinggw И запускаем /etc/mystathost/pinggw Если все в порядке и данные успешно записаны в базу то выполнив запрос мы увидим последние 10 записей. Зайдем в консоль MySQL сервера под нашим пользователем и паролем mysql -u'mystathost' -p'mYs1Pa_swD' и выполним: USE mystathost; select * from pinggw order by datetime desc limit 10; Если данные появились, можно прописать скрипт на автоматическое выполнение с помощью cron-а. Назначим выполнение раз в минуту: echo "* * * * * root /etc/mystathost/pinggw" >> /etc/crontab Если данные есть =Анализ данных= Примеры запросов для извлечения данных Сводная таблица усредненных потерь по каналам USE mystathost; SELECT hostip, hosteth, hostgwip, round(avg(pinglost),1) as lost FROM pinggw group by hostgwip order by avg(pinglost) desc; Статистика стабильности канала за период set @hostip:='10.0.34.1'; # Адрес удаленного сервера set @hostgwip:='95.143.8.33'; # Адрес контролируемого хоста на сервере set @firstdata:='2012/06/02 00:00:00'; # Дата и время начала периода set @lastdata:='2012/06/02 23:59:59'; # Дата и время окончания периода use mystathost; set @rx:=0; set @trx:=0; set @dateprev:=now(); select datetime, hostip, hosteth, hostgwip, pinglost, pingavg, round(rxt/secint/1024*8,2) as RxKbps, round(trxt/secint/1024*8,2) as TxKbps from (select UNIX_TIMESTAMP(datetime)-@dateprev as secint, @dateprev:=UNIX_TIMESTAMP(datetime) as ut, trafrx-@rx as rxt, traftx-@trx as trxt, @rx:=trafrx, @trx:=traftx, datetime, hostip, hosteth, hostgwip, pinglost, pingavg from pinggw where hostgwip = @hostgwip and hostip=@hostip and datetime >= @firstdata and datetime <= @lastdata order by datetime) as math1; Суммарный входящий трафик интерфейса за период в Мбайтах SET @hostip:='10.2.64.1'; SET @hosteth:='eth1'; SET @firstdata:='2012/06/01 18:00:00'; SET @lastdata:='2012/06/05 23:59:59'; use mystathost; set @hvo:=0; set @blrx:=RAND(); set @rx:=0; select sum(TRx) as Rx_Mb from (select min(datetime), max(datetime), min(tfrx), max(tfrx), Round((max(tfrx)-min(tfrx)+max(hvst))/1024/1024,2) as TRx, max(hvst) from (select hostip, datetime, if(trafrx-@rx<0,@blrx:=RAND(),0)as prv, if(trafrx-@rx<0,@hvo:=trafrx,0)as hvst, @rx:=trafrx as tfrx, @blrx as blrx from pinggw where hostip=@hostip AND hosteth=@hosteth AND datetime >= @firstdata AND datetime <= @lastdata order by datetime) as tbl1 group by blrx) as tbl2;